from formencode import *
from lex.model import *
from lex.model import DBSession, metadata, ExpresionRegular
from tw.forms.validators import *

_ = lambda s: s

#class UniqueUsername(FancyValidator):

#   not_empty = True

#   def validate_python(self, value, state):
#      usuarios = DBSession.query(Usuario)
#      for usuario in usuarios:
#         if value == usuario.nombre_usuario:
#             raise Invalid(
#                 'El nombre de usuario ya existe.',
#                 value, state)

#-----------------Validador del Nombre del Analizador Lexico--------------------

class NombreAnalizador(FancyValidator):

   not_empty = True

   def validate_python(self, value, state):

      #Verificamos que no se introduzcan espacios en blanco como nombre
      cadena = value
      lista = cadena.split()
      result = "".join(lista)
      if result == "":
         raise Invalid('Debe introducir un nombre!', value, state)


#-----------------Validador del Nombre de la Expresion Regular------------------

class NombreExpresion(FancyValidator):

   not_empty = True

   def validate_python(self, value, state):

      #Verificamos que no se introduzcan espacios en blanco como nombre
      cadena = value
      lista = cadena.split()
      result = "".join(lista)
      if result == "":
         raise Invalid('Debe introducir un nombre!', value, state)

      #Verificamos que el nombre sea simple
      lista_value = value.split()
      tamanho_lista = 0

      for sub in lista_value:
          tamanho_lista = tamanho_lista + 1

      if tamanho_lista > 1:
         raise Invalid('Debe introducir un nombre simple', value, state)


#-----------------Validador de la Definicion de la Expresion Regular------------

class DefinicionExpresion(FancyValidator):

   not_empty = True

   def validate_python(self, value, state):

      #Verificamos que no se introduzcan espacios en blanco como definicion
      cadena = value
      lista = cadena.split()
      result = "".join(lista)
      if result == "":
         raise Invalid('Debe introducir una definicion!', value, state)

      #Verificamos que los parentesis esten balanceados
      pila = []
      for c in value:
         if c=="(":
            pila.append(c)
         elif c==")":
            if pila == []:
               raise Invalid('Los parentesis no estan balanceados!', value, state)
            elif pila.pop() != "(":
               raise Invalid('Los parentesis no estan balanceados!', value, state)

      if pila == []:
         pass
      else:
         raise Invalid('Los parentesis no estan balanceados!', value, state)


class NotEmpty_PlainText(Regex):

    regex = r"^[a-zA-Z_\-0-9\s]*$"

    messages = {
        'invalid': _('Introduzca solo "letras", o "numeros", o "_", o "-")'),
        'empty': _("Rellene el campo"),
        }

    not_empty = True

    def validate_python(self, value, state):
        self.assert_string(value, state)
        if self.strip and isinstance(value, basestring):
            value = value.strip()
        if not self.regex.search(value):
            raise Invalid(self.message('invalid', state),
                          value, state)
        if value == 0:
            # This isn't "empty" for this definition.
            return value
        if not value:
            raise Invalid(self.message('empty', state),
                          value, state)


class NotEmpty_Text(Regex):

    regex = r"^[a-zA-Z\s]*$"

    messages = {
        'invalid': _('Introducir solo letras'),
        'empty': _("Rellene el campo"),
        }

    not_empty = True

    def validate_python(self, value, state):
        self.assert_string(value, state)
        if self.strip and isinstance(value, basestring):
            value = value.strip()
        if not self.regex.search(value):
            raise Invalid(self.message('invalid', state),
                          value, state)
        if value == 0:
            # This isn't "empty" for this definition.
            return value
        if not value:
            raise Invalid(self.message('empty', state),
                          value, state)


class MiPlainText(Regex):

    regex = r"^[a-zA-Z_/\-0-9\s]*$"

    messages = {
        'invalid': _('Introduzca solo "letras", o "numeros", o "_", o "/", o "-")'),
        }


    def validate_python(self, value, state):
        self.assert_string(value, state)
        if self.strip and isinstance(value, basestring):
            value = value.strip()
        if not self.regex.search(value):
            raise Invalid(self.message('invalid', state),
                          value, state)


class NumerosTelefono(Regex):

    regex = r"^[-\0-9]*$"

    messages = {
        'invalid': _('Introduzca solo "numeros", o "-")'),
        }


    def validate_python(self, value, state):
        self.assert_string(value, state)
        if self.strip and isinstance(value, basestring):
            value = value.strip()
        if not self.regex.search(value):
            raise Invalid(self.message('invalid', state),
                          value, state)



